package main

import (
	"fmt"
	"sync"
	"training_project/test"
)

// fanIn 函数将多个 goroutine 的输出汇总到一个通道
func fanIn(chs ...<-chan int) <-chan int {
	out := make(chan int)
	var wg sync.WaitGroup

	// 从每个输入通道读取数据，并将数据发送到 out 通道
	for _, ch := range chs {
		wg.Add(1)
		go func(c <-chan int) {
			defer wg.Done()
			for v := range c {
				out <- v
			}
		}(ch)
	}

	// 当所有通道都完成时关闭 out 通道
	go func() {
		wg.Wait()
		close(out)
	}()

	return out
}

// worker 模拟一个 fan out 的处理函数
func worker(in <-chan int) <-chan int {
	out := make(chan int)
	go func() {
		defer close(out)
		for v := range in {
			out <- v * 2 // 简单的乘以2的处理逻辑
		}
	}()
	return out
}

func main() {
	test.Test_print()
	// 输入通道，模拟一些数据源
	input := make(chan int)

	// 启动三个 fan out 的 worker
	ch1 := worker(input)
	ch2 := worker(input)
	ch3 := worker(input)

	// fan in 汇总 worker 的结果
	result := fanIn(ch1, ch2, ch3)

	// 向输入通道发送数据
	go func() {
		for i := 1; i <= 12; i++ {
			input <- i
		}
		close(input)
	}()

	// 打印 fan in 通道中的结果
	for res := range result {
		fmt.Println(res)
	}
}
